﻿using JavaDevToys.Rcl.Models;
using LibGit2Sharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace JavaDevToys.Rcl.Service.Impl
{
    public class JavaProjectService : IJavaProjectService
    {

        public bool AddGitRepository(string fileFullName,out string errMsg)
        {
            errMsg = string.Empty;
            var directoryPath = Path.GetDirectoryName(fileFullName);
            string repositoryPath = Directory.GetParent(GetGitRepositoryPath(directoryPath)).Parent.FullName;
            string filePath = GetRelativePath(fileFullName, repositoryPath);
            // 设置 Git 命令参数
            string arguments = $"add \"{filePath}\"";

            // 配置 ProcessStartInfo
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                FileName = "git", // Git 命令
                Arguments = arguments, // 参数
                WorkingDirectory = repositoryPath, // 工作目录
                RedirectStandardOutput = true, // 重定向标准输出
                RedirectStandardError = true, // 重定向错误输出
                UseShellExecute = false, // 不使用操作系统外壳程序
                CreateNoWindow = true // 不创建窗口
            };

            // 创建 Process 对象
            Process process = new Process
            {
                StartInfo = startInfo
            };

            try
            {
                // 启动进程
                process.Start();

                // 获取命令输出和错误输出
                string output = process.StandardOutput.ReadToEnd();
                string error = process.StandardError.ReadToEnd();

                process.WaitForExit(); //等待进程执行完毕

                // 输出结果
                if (!string.IsNullOrEmpty(output))
                {
                    errMsg = output;
                    process.Dispose();
                    return true;
                }
                if (!string.IsNullOrEmpty(error))
                {
                    errMsg = error;
                    process.Dispose();
                    return false;
                }
                else
                {
                    errMsg = $"文件 {filePath} 添加成功！";
                    process.Dispose();
                    return true;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("执行命令时出错: " + ex.Message);
                process.Dispose();
                return false;
            }

        }

        /// <summary>
        /// 获取指定路径所在的 Git 仓库根路径。
        /// </summary>
        /// <param name="path">任意文件或目录路径</param>
        /// <returns>Git 仓库根路径，如果不是 Git 仓库则返回 null</returns>
        private string GetGitRepositoryPath(string path)
        {
            try
            {
                return Repository.Discover(path);
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 获取文件路径相对路径。
        /// </summary>
        /// <param name="filespec">文件完整路径</param>
        /// <param name="folder">仓库根目录路径</param>
        /// <returns>相对路径</returns>
        private string GetRelativePath(string filespec, string folder)
        {
            Uri pathUri = new Uri(filespec);
            // 确保文件夹路径以目录分隔符结尾
            if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString()))
            {
                folder += Path.DirectorySeparatorChar;
            }
            Uri folderUri = new Uri(folder);
            return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar));
        }

        
    }
}
